\chapter{数字签名(digital signatures)}

\section{数字签名的基本概念}
此节内容来自阮一峰的网络日志\footnote{阮一峰的网络日志为\url{http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html}}，其翻译了国外一个数字签名的介绍\footnote{What is a Digital Signature?An introduction to Digital Signatures, by David Youd,url is \url{http://www.youdzone.com/signature.html}}，形象，故此直接引用。\par
\begin{enumerate}
	\item 鲍勃有两把钥匙，一把是公钥，另一把是私钥。
	\begin{figure}[htbp]
		\centering
		\includegraphics[width=0.5\textwidth]{DS-example-01.png}
	\end{figure}
	\item 鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。
	\begin{figure}[htbp]
		\centering
		\includegraphics[width=0.5\textwidth]{DS-example-02.png}
	\end{figure}
	\item 苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密，就可以达到保密的效果。
	\begin{figure}[htbp]
		\centering
		\includegraphics[width=0.5\textwidth]{DS-example-03.png}
	\end{figure}
	\item 鲍勃收信后，用私钥解密，就看到了信件内容。这里要强调的是，只要鲍勃的私钥不泄露，这封信就是安全的，即使落在别人手里，也无法解密。
	\begin{figure}[htbp]
		\centering
		\includegraphics[width=0.5\textwidth]{DS-example-04.png}
	\end{figure}
	\item 鲍勃给苏珊回信，决定采用"数字签名"。他写完后先用Hash函数，生成信件的摘要（digest）。
	\begin{figure}[htbp]
		\centering
		\includegraphics[width=0.5\textwidth]{DS-example-05.png}
	\end{figure}
	\item 然后，鲍勃使用私钥，对这个摘要加密，生成"数字签名"（signature）。
	\begin{figure}[htbp]
		\centering
		\includegraphics[width=0.5\textwidth]{DS-example-06.png}
	\end{figure}
	\item 鲍勃将这个签名，附在信件下面，一起发给苏珊。\par
		\centerline{
			\includegraphics[width=0.5\textwidth]{DS-example-07.png}
		}
	
	\item 苏珊收信后，取下数字签名，用鲍勃的公钥解密，得到信件的摘要。由此证明，这封信确实是鲍勃发出的。\par
			\centerline{
				\includegraphics[width=0.5\textwidth]{DS-example-08.png}
			}
	
	\item 苏珊再对信件本身使用Hash函数，将得到的结果，与上一步得到的摘要进行对比。如果两者一致，就证明这封信未被修改过。\par
			\centerline{
				\includegraphics[width=0.5\textwidth]{DS-example-09.png}
			}
		
	\item 复杂的情况出现了。道格想欺骗苏珊，他偷偷使用了苏珊的电脑，用自己的公钥换走了鲍勃的公钥。此时，苏珊实际拥有的是道格的公钥，但是还以为这是鲍勃的公钥。因此，道格就可以冒充鲍勃，用自己的私钥做成"数字签名"，写信给苏珊，让苏珊用假的鲍勃公钥进行解密。\par
	\centerline{
		\includegraphics[width=0.5\textwidth]{DS-example-10.png}
	}
	
	\item 后来，苏珊感觉不对劲，发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法，要求鲍勃去找"证书中心"（certificate authority，简称CA），为公钥做认证。证书中心用自己的私钥，对鲍勃的公钥和一些相关信息一起加密，生成"数字证书"（Digital Certificate）。\par
	\centerline{
		\includegraphics[width=0.5\textwidth]{DS-example-11.png}
	}

	\item 鲍勃拿到数字证书以后，就可以放心了。以后再给苏珊写信，只要在签名的同时，再附上数字证书就行了。\par
	\centerline{
		\includegraphics[width=0.5\textwidth]{DS-example-12.png}
	}
	
	\item 苏珊收信后，用CA的公钥解开数字证书，就可以拿到鲍勃真实的公钥了，然后就能证明"数字签名"是否真的是鲍勃签的。\par
	\centerline{
		\includegraphics[width=0.5\textwidth]{DS-example-13.png}
	}
	
\end{enumerate}
\section{Https实例}
我们经常会用到https协议，这个协议主要用于网页加密，这就是一个应用"数字证书"的实例。以下这个例子来自于阮一峰的网络日志\footnote{阮一峰的网络日志为\url{http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html}}。

	\begin{figure}[htbp]
		\centering
		\includegraphics[width=0.5\textwidth]{dc-example-1.png}
	\end{figure}
\begin{enumerate}
	\item 首先，客户端向服务器发出加密请求。\par
		\centerline{
			\includegraphics[width=0.5\textwidth]{dc-example-2.png}
		}
			
	\item 服务器用自己的私钥加密网页以后，连同本身的数字证书，一起发送给客户端。\par
		\centerline{
			\includegraphics[width=0.5\textwidth]{dc-example-3.png}
		}


	\item 客户端（浏览器）的"证书管理器"，有"受信任的根证书颁发机构"列表。客户端会根据这张列表，查看解开数字证书的公钥是否在列表之内。\par
		\centerline{
			\includegraphics[width=0.5\textwidth]{dc-example-4.png}
		}
	
	\item 如果数字证书记载的网址，与你正在浏览的网址不一致，就说明这张证书可能被冒用，浏览器会发出警告。\par
		\centerline{
			\includegraphics[width=0.5\textwidth]{dc-example-5.png}
		}
	
	\item 如果这张数字证书不是由受信任的机构颁发的，浏览器会发出另一种警告。\par
		\centerline{
			\includegraphics[width=0.5\textwidth]{dc-example-6.png}
		}
	
	\item 如果数字证书是可靠的，客户端就可以使用证书中的服务器公钥，对信息进行加密，然后与服务器交换加密信息。\par
		\centerline{
			\includegraphics[width=0.5\textwidth]{dc-example-7.png}
		}
\end{enumerate}

\section{签名方案与标准}



\subsection{DSS}
DSS(Digital Signature Standard)是美国的国家标准，目前最新发布的是2013版\footnote{最新版可以从美国NIST网站上下载，地址为\url{https://www.nist.gov/publications/digital-signature-standard-dss-2}}，其封皮如图\ref{dss-2013-cover}。
\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.5\textwidth]{DSS-SPECIFIC-2013.PNG}
	\caption{2013年发布的DSS}
	\label{dss-2013-cover}
\end{figure}
在DSS 2013版中，对DSS概要描述见图\ref{dss-2013-intruduction}。
\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.8\textwidth]{DS-introduction.PNG}
	\caption{2013年发布的DSS中的Introduction部分}
	\label{dss-2013-intruduction}
\end{figure}
而DSS的基本过程如图\ref{ds-process}。
\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.5\textwidth]{DS-PROCESS.PNG}
	\caption{2013年发布的DSS中的Introduction部分}
	\label{ds-process}
\end{figure}

\par
从文档描述中我们可看到，DSS标准支持三种签名算法：DSA(Digital Signature Algorithm)、RSA Digital Signature Algorithm、Elliptic Curve Digital Signature Algorithm (ECDSA)。

\subsubsection{RSA签名}
DSS中并没有规范RSA签名算法，而是引用了另外两个标准，这两个标准定义了RSA签名算法(见图\ref{ds-rsa-introduction})。
\begin{figure}[htbp]
	\centering
	\includegraphics[width=0.5\textwidth]{DSS-RSA-introduction.PNG}
	\caption{DSS中使用的RSA签名标准}
	\label{ds-rsa-introduction}
\end{figure}
\par
下面我们简单说一下RSA的签名原理。
\par
$pk_a,sk_a$分别表示a的公钥和私钥，H表示哈希函数，E表示加密函数，D表示解密函数，C表示一个数的比较函数，相当为真，不等为假，$a\rightarrow b:M$表示a把消息M发给b，$a\leftarrow b:M$表示b把消息M发到给a,$b:H(M)$表示在b端计算M的哈希值，那么RSA签名可以表示为：
\begin{enumerate}
	\item $a:ds=E_{sk_a}(H(M))$
	\item $a\rightarrow b:M || ds$
	\item $b:C(D_{pk_a}(ds),H(M))$为真则签名有效，否则签名无效。
\end{enumerate}